home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / perl / perl5a1.lha / perl5alpha1 / do / gsent < prev    next >
Encoding:
Text File  |  1992-08-15  |  1.7 KB  |  78 lines

  1. int
  2. do_gsent(which,gimme,arglast)
  3. int which;
  4. int gimme;
  5. int *arglast;
  6. {
  7.     register ARRAY *ary = stack;
  8.     register int sp = arglast[0];
  9.     register char **elem;
  10.     register STR *TARG;
  11.     struct servent *getservbyname();
  12.     struct servent *getservbynumber();
  13.     struct servent *getservent();
  14.     struct servent *sent;
  15.  
  16.     if (which == O_GSBYNAME) {
  17.     char *name = str_get(ary->ary_array[sp+1]);
  18.     char *proto = str_get(ary->ary_array[sp+2]);
  19.  
  20.     if (proto && !*proto)
  21.         proto = Nullch;
  22.  
  23.     sent = getservbyname(name,proto);
  24.     }
  25.     else if (which == O_GSBYPORT) {
  26.     int port = (int)str_gnum(ary->ary_array[sp+1]);
  27.     char *proto = str_get(ary->ary_array[sp+2]);
  28.  
  29.     sent = getservbyport(port,proto);
  30.     }
  31.     else
  32.     sent = getservent();
  33.  
  34.     if (gimme != G_ARRAY) {
  35.     astore(ary, ++sp, TARG = str_mortal(&str_undef));
  36.     if (sent) {
  37.         if (which == O_GSBYNAME) {
  38. #ifdef HAS_NTOHS
  39.         str_numset(TARG, (double)ntohs(sent->s_port));
  40. #else
  41.         str_numset(TARG, (double)(sent->s_port));
  42. #endif
  43.         }
  44.         else
  45.         str_set(TARG, sent->s_name);
  46.     }
  47.     return sp;
  48.     }
  49.  
  50.     if (sent) {
  51. #ifndef lint
  52.     (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
  53.     str_set(TARG, sent->s_name);
  54.     (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
  55.     for (elem = sent->s_aliases; *elem; elem++) {
  56.         str_cat(TARG, *elem);
  57.         if (elem[1])
  58.         str_ncat(TARG," ",1);
  59.     }
  60.     (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
  61. #ifdef HAS_NTOHS
  62.     str_numset(TARG, (double)ntohs(sent->s_port));
  63. #else
  64.     str_numset(TARG, (double)(sent->s_port));
  65. #endif
  66.     (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
  67.     str_set(TARG, sent->s_proto);
  68. #else /* lint */
  69.     elem = Nullch;
  70.     elem = elem;
  71.     (void)astore(ary, ++sp, str_mortal(&str_no));
  72. #endif /* lint */
  73.     }
  74.  
  75.     return sp;
  76. }
  77.  
  78.